<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>用Docker安装 Elasticsearch | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'docker.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/docker.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/docker.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/docker.html" rel="nofollow" target="_blank">../en/docker.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="setup.html">安装设置</a></span>
»
<span class="breadcrumb-link"><a href="install-elasticsearch.html">安装 Elasticsearch</a></span>
»
<span class="breadcrumb-node">用Docker安装 Elasticsearch</span>
</div>
<div class="navheader">
<span class="prev">
<a href="windows.html">« 使用windows安装包安装 Elasticsearch</a>
</span>
<span class="next">
<a href="brew.html">在MacOS上用Homebrew安装 Elasticsearch »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="docker"></a>
用Docker安装 Elasticsearch
</h2>
</div></div></div>
<p>
还可以使用 Docker 镜像安装 Elasticsearch。

镜像以 <a href="https://hub.docker.com/_/centos/" class="ulink" target="_top">centos:7</a> 为基础。
</p>
<p>
所有已发布的 Docker 镜像和 tag 的列表可以在 <a href="https://www.docker.elastic.co" class="ulink" target="_top">www.docker.elastic.co</a> 获得。

源文件位于 <a href="https://github.com/elastic/elasticsearch/blob/7.7/distribution/docker" class="ulink" target="_top">Github</a>。
</p>
<p>
此软件包可在 Elastic 许可下免费使用。

它包含开放源码和免费的商业特性，并能访问付费商业特性。

<a href="https://www.elastic.co/guide/en/kibana/7.7/managing-licenses.html" class="ulink" target="_top">开始为期30天的试用</a> 尝试使用付费的商业特性。

有关 Elastic 许可等级的更多信息，请参考 <a href="https://www.elastic.co/subscriptions" class="ulink" target="_top">订阅（Subscriptions）</a> 页面。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_pulling_the_image"></a>
拉取镜像
</h3>
</div></div></div>
<p>
获取 Docker 的 Elasticsearch 就像对 Elastic Docker 注册发出 <code class="literal">docker pull</code> 命令一样简单。
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1</pre>
</div>
<p>
或者，您可以下载仅包含 Apache 2.0 许可证下可用功能的其他 Docker 映像。

要下载镜像，请访问 <a href="https://www.docker.elastic.co" class="ulink" target="_top">www.docker.elastic.co</a>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="docker-cli-run-dev-mode"></a>
用 Docker 启动一个单节点集群
</h3>
</div></div></div>
<p>
要为开发或测试启动一个单节点的 Elasticsearch 集群，请指定 <a class="xref" href="bootstrap-checks.html#single-node-discovery" title="Single-node discovery">单节点发现</a> 以跳过 <a class="xref" href="bootstrap-checks.html" title="Bootstrap Checks">引导检查</a> 。
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.7.1</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="docker-compose-file"></a>
使用 Docker Compose 启动一个多节点集群
</h3>
</div></div></div>
<p>
要在 Docker 中启动并运行一个三个节点的 Elasticsearch 集群，可以使用 Docker Compose：
</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
创建 <code class="literal">docker-compose.yml</code> 文件：
</li>
</ol>
</div>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge</pre>
</div>
<p>
这个 Docker Compose 演示文件创建了一个三个节点的 Elasticsearch 集群。

节点 <code class="literal">es01</code> 监听 <code class="literal">localhost:9200</code>，<code class="literal">es02</code> 和 <code class="literal">es03</code> 通过网络与 <code class="literal">es01</code> 进行通信。
</p>
<p>
请注意，这个配置会暴露所有的网络接口上的9200 端口，并给出了 Docker 如何在 Linux 上操作 <code class="literal">iptables</code> ，这意味着你的 Elasticsearch 集群是可公开访问的，可能会忽略任何防火墙设置。

如果你不想公开 9200 端口，而是使用反向代理，请在 docker-compose.yml 文件中将<code class="literal">9200:9200</code>替换为<code class="literal">127.0.0.1:9200:9200</code>。

这样只有在 Elasticsearch 的宿主机上才能访问。
</p>
<p>
<a href="https://docs.docker.com/storage/volumes" class="ulink" target="_top">Docker命名的卷</a> <code class="literal">data01</code>、<code class="literal">data02</code> 和 <code class="literal">data03</code> 存储节点数据目录，以便数据在重启时保持不变。

如果它们尚不存在，<code class="literal">docker-compose</code> 会在创建集群时建立之。
</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p>
确保给 Docker 引擎 至少分配了 4 GiB的内存。

在 Docker Desktop 中，你可以在 首选项(Preference, macOS系统) 或 设置(Settings, Windows系统)中的 高级(Advanced) 选项卡上配置资源使用。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
Linux上的 Docker Compose 并未随 Docker 预装。

安装向导请参考 docs.docker.com ：<a href="https://docs.docker.com/compose/install" class="ulink" target="_top">在 Linux 上安装 Compose</a>
</p>
</div>
</div>
</li>
<li class="listitem">
<p>
运行 <code class="literal">docker-compose</code> 来创建集群:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker-compose up</pre>
</div>
</li>
<li class="listitem">
<p>
发送一个 <code class="literal">_cat/nodes</code> 请求去看看节点是否已启动并运行：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">curl -X GET "localhost:9200/_cat/nodes?v&amp;pretty"</pre>
</div>
</li>
</ol>
</div>
<p>
日志消息转到控制台，由配置的 Docker 日志记录驱动程序处理。

默认情况下，你可以使用 <code class="literal">docker logs</code>来获取日志。
</p>
<p>
要停止集群，执行 <code class="literal">docker-compose down</code>。

当你使用 <code class="literal">docker-compose up</code>重新启动集群时，Docker 卷中的数据将被保留并加载。

要在关闭集群时 <span class="strong strong"><strong>删除数据卷</strong></span> ，请指定 <code class="literal">-v</code> 选项： <code class="literal">docker-compose down -v</code>。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="next-getting-started-tls-docker"></a>
启动一个多节点集群并开启 TLS 支持
</h4>
</div></div></div>
<p>
参考 <a class="xref" href="configuring-tls-docker.html" title="Encrypting communications in an Elasticsearch Docker Container">在 Elasticsearch Docker 容器中加密通信</a> 和 <a href="https://www.elastic.co/guide/en/elastic-stack-get-started/7.7/get-started-docker.html#get-started-docker-tls" class="ulink" target="_top">在 Docker 中运行 Elastic Stack 并开启 TLS 支持</a>.
</p>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="docker-prod-prerequisites"></a>
在生产环境中使用 Docker 镜像
</h3>
</div></div></div>
<p>
以下要求和建议适用于在生产环境的 Docker 中运行 Elasticsearch。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_set_vm_max_map_count_to_at_least_262144"></a>
<code class="literal">vm.max_map_count</code> 至少设置为 <code class="literal">262144</code>
</h4>
</div></div></div>
<p>
在生产环境中使用时，内核设置 <code class="literal">vm.max_map_count</code> 必须至少设置为 <code class="literal">262144</code>。
</p>
<p>
如何设置 <code class="literal">vm.max_map_count</code> 取决于你使用的平台：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>Linux</p>
<p>
<code class="literal">vm.max_map_count</code> 应该在 <code class="literal">/etc/sysctl.conf</code> 中永久设置。
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144</pre>
</div>
<p>
要在运行中的系统上应用设置，执行：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">sysctl -w vm.max_map_count=262144</pre>
</div>
</li>
<li class="listitem">
<p>
有<a href="https://docs.docker.com/docker-for-mac" class="ulink" target="_top">Mac版Docker</a>的macOS
</p>
<p>
<code class="literal">vm.max_map_count</code>必须在 xhyve 虚拟机中设置：
</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p>
从命令行执行：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty</pre>
</div>
</li>
<li class="listitem">
<p>
按回车，并使用<code class="literal">sysctl</code>来配置<code class="literal">vm.max_map_count</code>：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">sysctl -w vm.max_map_count=262144</pre>
</div>
</li>
<li class="listitem">
要退出<code class="literal">screen</code>会话，输入<code class="literal">Ctrl a d</code>。
</li>
</ol>
</div>
</li>
<li class="listitem">
<p>
Windows 和 安装了<a href="https://www.docker.com/products/docker-desktop" class="ulink" target="_top">Docker Desktop</a>的macOS
</p>
<p>
<code class="literal">vm.max_map_count</code>的设置必须使用<code class="literal">docker-machine</code>:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker-machine ssh
sudo sysctl -w vm.max_map_count=262144</pre>
</div>
</li>
</ul>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_configuration_files_must_be_readable_by_the_elasticsearch_user"></a>
配置文件必须对用户<code class="literal">elasticsearch</code>可读
</h4>
</div></div></div>
<p>
默认情况下，Elasticsearch 以用户 <code class="literal">elasticsearch</code>在容器内运行，使用的 uid:gid 为<code class="literal">1000:0</code>。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<a href="https://docs.openshift.com/container-platform/3.6/creating_images/guidelines.html#openshift-specific-guidelines" class="ulink" target="_top">Openshift</a>是一个例外，它使用任意分配的用户ID运行容器。

Openshift呈现 gid 设置为<code class="literal">0</code>的持久卷，无需任何调整即可工作。
</p>
</div>
</div>
<p>
如果要 绑定挂载(bind-mounting) 本地目录或文件，用户<code class="literal">elasticsearch</code>必须能够读取该目录或文件。

此外，该用户必须对<a class="xref" href="path-settings.html" title="path.data and path.logs">数据和日志目录</a>有写权限。

一个好的策略是为本地目录授予对 gid 为 <code class="literal">0</code> 的组的访问权限。
</p>
<p>
例如，要准备一个通过 绑定挂载(bind-mount) 的本地目录来存储数据:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir</pre>
</div>
<p>
最后，可以通过环境变量 <code class="literal">TAKE_FILE_OWNERSHIP</code> 强制容器改变用于任何 绑定挂载(bind-mount) 的<a class="xref" href="path-settings.html" title="path.data and path.logs">数据和日志目录</a>的所有权。

当你这样做时，它们的所有者是 对 Elasticsearch 进程有读/写访问权限的 uid:gid <code class="literal">1000:0</code>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_increase_ulimits_for_nofile_and_nproc"></a>
给 nofile 和 nproc 增加 ulimits
</h4>
</div></div></div>
<p>
Elasticsearch 容器必须增加 <a class="xref" href="setting-system-settings.html" title="Configuring system settings">nofile</a> 和 <a class="xref" href="max-number-threads-check.html" title="Maximum number of threads check">nproc</a> 的 ulimits。

验证 Docker 守护程序的<a href="https://github.com/moby/moby/tree/ea4d1243953e6b652082305a9c3cda8656edab26/contrib/init" class="ulink" target="_top">初始化系统(init system)</a>是否将它们设置为可接受的值。
</p>
<p>
要检查 Docker 守护程序的 ulimits 默认值，运行：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker run --rm centos:7 /bin/bash -c 'ulimit -Hn &amp;&amp; ulimit -Sn &amp;&amp; ulimit -Hu &amp;&amp; ulimit -Su'</pre>
</div>
<p>
如果需要，在守护程序中调整它们，或者覆盖每个容器中的设置。

例如，当使用<code class="literal">docker run</code>时，设置:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">--ulimit nofile=65535:65535</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_disable_swapping"></a>
禁用 swapping
</h4>
</div></div></div>
<p>
为了性能和节点的稳定性，需要禁用swapping。

关于如何做到这一点，请参考<a class="xref" href="setup-configuration-memory.html" title="Disable swapping">禁用 swapping</a>.
</p>
<p>
如果你选择使用<code class="literal">bootstrap.memory_lock: true</code>，还需要在<a href="https://docs.docker.com/engine/reference/commandline/dockerd/#default-ulimits" class="ulink" target="_top">Docker Daemon</a>中定义<code class="literal">memlock: true</code> ulimit，或者像<a class="xref" href="docker.html#docker-compose-file" title="Starting a multi-node cluster with Docker Compose">compose 示例文件</a>那样显式的设置容器。

当使用<code class="literal">docker run</code>时，可以指定：
</p>
<pre class="literallayout">-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_randomize_published_ports"></a>
随机化发布的端口 (Randomize published ports)
</h4>
</div></div></div>
<p>
该镜像<a href="https://docs.docker.com/engine/reference/builder/#/expose" class="ulink" target="_top">暴露(exposes)</a>了 TCP 端口 9200 和 9300。

对于生产环境的集群，建议使用<code class="literal">--publish-all</code>对发布的端口进行随机化，除非为每个主机固定一个容器。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="docker-set-heap-size"></a>
设置堆内存大小(heap size)
</h4>
</div></div></div>
<p>
要配置堆内存大小, 可以在<code class="literal">/usr/share/elasticsearch/config/jvm.options.d</code>下 绑定挂载 一个包含所需<a class="xref" href="heap-size.html" title="Setting the heap size">堆内存大小</a>设置的<a class="xref" href="jvm-options.html" title="Setting JVM options">JVM 选项</a>文件。

请注意，虽然默认的根<code class="literal">jvm.options</code>文件设置了 1 GB 的默认堆大小，但是你在 绑定挂载 的<a class="xref" href="jvm-options.html" title="Setting JVM options">JVM 选项</a>文件中设置的任何值都将覆盖它。
</p>
<p>
虽然通过 绑定挂载 的 JVM选项 设置堆大小是推荐的方法，但是你也可以通过使用环境变量<code class="literal">ES_JAVA_OPTS</code>来设置堆大小来配置它。

比如，要想设置为 16GB，使用<code class="literal">docker run</code>指定<code class="literal">-e ES_JAVA_OPTS="-Xms16g -Xmx16g"</code>。

请注意，虽然默认的根<code class="literal">jvm.options</code>文件设置了1 GB的默认堆大小，但你在<code class="literal">ES_JAVA_OPTS</code>设置的任何值都将覆盖它。

上面的<code class="literal">docker-compose.yml</code>文件将堆大小设置为 512 MB。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
即使你<a href="https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory" class="ulink" target="_top">限制容器的内存使用</a>，你也必须<a class="xref" href="heap-size.html" title="Setting the heap size">设置堆大小</a>。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_pin_deployments_to_a_specific_image_version"></a>
将部署固定到指定版本的镜像
</h4>
</div></div></div>
<p>
将部署固定到指定版本的Elasticsearch Docker镜像
比如 <code class="literal">docker.elastic.co/elasticsearch/elasticsearch:7.7.1</code>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_always_bind_data_volumes"></a>
总是绑定数据卷 (Always bind data volumes)
</h4>
</div></div></div>
<p>
由于以下几个原因, 你应该使用一个绑定在<code class="literal">/usr/share/elasticsearch/data</code>上的卷：
</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
即使容器被杀掉，你的Elasticsearch节点的数据也不会丢失
</li>
<li class="listitem">
Elasticsearch 对 I/O 敏感，而Docker存储器不能提供快速 I/O
</li>
<li class="listitem">
它允许使用高级的<a href="https://docs.docker.com/engine/extend/plugins/#volume-plugins" class="ulink" target="_top">Docker卷插件</a>
</li>
</ol>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_avoid_using_loop_lvm_mode"></a>
避免使用 <code class="literal">loop-lvm</code> 模式
</h4>
</div></div></div>
<p>
如果你正在使用设备映射存储驱动，请不要使用默认的<code class="literal">loop-lvm</code>模式。

将 docker-engine 配置为使用<a href="https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-docker-with-devicemapper" class="ulink" target="_top">direct-lvm</a>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_centralize_your_logs"></a>
日志中心化
</h4>
</div></div></div>
<p>
考虑使用不同的<a href="https://docs.docker.com/engine/admin/logging/overview/" class="ulink" target="_top">日志驱动程序(logging driver)</a>来集中日志。
还要注意的是，默认的 json-file 日志驱动不太适合生产环境使用。
</p>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="docker-configuration-methods"></a>
使用 Docker 配置 Elasticsearch
</h3>
</div></div></div>
<p>
当在Docker中运行时，<a class="xref" href="settings.html#config-files-location" title="Config files location">Elasticsearch的配置文件</a>是从<code class="literal">/usr/share/elasticsearch/config/</code>加载的。
</p>
<p>
要使用自定义的配置文件，请<a class="xref" href="docker.html#docker-config-bind-mount" title="Mounting Elasticsearch configuration files">绑定挂载(bind-mount)文件</a>到镜像中的配置文件。
</p>
<p>
可以使用 Docker 环境变量设置独立的 Elasticearch 配置参数。

<a class="xref" href="docker.html#docker-compose-file" title="Starting a multi-node cluster with Docker Compose">compose示例文件</a>和<a class="xref" href="docker.html#docker-cli-run-dev-mode" title="Starting a single node cluster with Docker">单节点示例</a>使用的就是这种方法。
</p>
<p>
要使用一个文件的内容去设置一个环境变量，请将环境拜年了的名称以<code class="literal">_FILE</code>为后缀。

这对于在不直接指定密码的情况下将密码等机密信息传递给 Elasticearch 非常有用。
</p>
<p>
比如，要从文件设置 Elasticsearch 的启动密码，你可以绑定挂载一个文件并设置环境变量<code class="literal">ELASTIC_PASSWORD_FILE</code>到这个挂载的位置。

如果你挂载密码文件到<code class="literal">/run/secrets/password.txt</code>，请指定：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">-e ELASTIC_PASSWORD_FILE=/run/secrets/bootstrapPassword.txt</pre>
</div>
<p>
你还可以重写镜像的默认命令，以命令行选项的形式传递 Elasticsearch 的配置参数。比如：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker run &lt;various parameters&gt; bin/elasticsearch -Ecluster.name=mynewclustername</pre>
</div>
<p>
虽然绑定挂载配置文件通常是生产环境中首选的方法，但还可以使用包含自定义配置的方式<a class="xref" href="docker.html#_c_customized_image" title="Using custom Docker images">创建自定义的Docker镜像</a>。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="docker-config-bind-mount"></a>
挂载 Elasticsearch 配置文件
</h4>
</div></div></div>
<p>
创建自定义配置文件，并将它们绑定挂载到Docker映像中的相应文件上。
比如，要使用<code class="literal">docker run</code>挂载绑定<code class="literal">custom_elasticsearch.yml</code>，请指定：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml</pre>
</div>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
容器 <span class="strong strong"><strong>以用户<code class="literal">elasticsearch</code>的身份运行 Elasticsearch，使用 uid:gid <code class="literal">1000:0</code> </strong></span>。

该用户必须能访问绑定挂载的宿主目录和文件，必须可以写入数据和日志目录。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="docker-keystore-bind-mount"></a>
Mounting an Elasticsearch keystore
</h4>
</div></div></div>
<p>
默认情况下，ElasticSearch 将自动为安全设置生成一个密钥存储库文件。
此文件被混淆，但未加密。

如果你想用密码去加密<a class="xref" href="secure-settings.html" title="Secure settings">安全设置</a>，必须使用<code class="literal">elasticsearch-keystore</code>程序去创建一个受密码保护的密钥存储库并将其作为<code class="literal">/usr/share/elasticsearch/config/elasticsearch.keystore</code>绑定挂载到容器。

为了在 Docker 容器启动时为其提供密码，请将 Docker 环境值 <code class="literal">KEYSTORE_PASSWORD</code> 设置为你的密码。
比如，一个<code class="literal">docker run</code>命令可能有下面的这些选项：
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">-v full_path_to/elasticsearch.keystore:/usr/share/elasticsearch/config/elasticsearch.keystore
-E KEYSTORE_PASSWORD=mypassword</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_c_customized_image"></a>
使用自定义的 Docker 镜像
</h4>
</div></div></div>
<p>
在某些环境中，准备一个包含你自己的配置的自定义映像可能更有意义。  
要实现这一点，<code class="literal">Dockerfile</code> 可能就像下面这样这么简单:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">FROM docker.elastic.co/elasticsearch/elasticsearch:7.7.1
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/</pre>
</div>
<p>
然后你可以构建并运行镜像:
</p>
<div class="pre_wrapper lang-sh">
<pre class="programlisting prettyprint lang-sh">docker build --tag=elasticsearch-custom .
docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom</pre>
</div>
<p>
某些插件需要额外的安全权限。
必须以下面某一种方式显式的接受这些权限要求：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
运行Docker镜像时附加一个<code class="literal">tty</code>，并在提示权限时允许之。
</li>
<li class="listitem">
检查安全权限并接受之（如何合适）

通过将<code class="literal">--batch</code>标志添加到插件安装命令中，检查安全权限并接受它们(如果适当的话)。
</li>
</ul>
</div>
<p>
更多信息参考<a href="https://www.elastic.co/guide/en/elasticsearch/plugins/7.7/_other_command_line_parameters.html" class="ulink" target="_top">插件管理</a>。
</p>
</div>

</div>

<div class="section exclude">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_next_steps_6"></a>
下一步
</h3>
</div></div></div>
<p>
你现在已经设置了一个 Elasticsearch 测试环境。

在开始正式开发或开始使用 Elasticsearch 进行生产之前，你还必须做一些额外的设置：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
学习如何 <a class="xref" href="settings.html" title="Configuring Elasticsearch">配置 Elasticsearch</a>。
</li>
<li class="listitem">
配置 <a class="xref" href="important-settings.html" title="Important Elasticsearch configuration">重要的 Elasticsearch 设置</a>。
</li>
<li class="listitem">
配置 <a class="xref" href="system-config.html" title="Important System Configuration">重要的系统设置</a>。
</li>
</ul>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="windows.html">« 使用windows安装包安装 Elasticsearch</a>
</span>
<span class="next">
<a href="brew.html">在MacOS上用Homebrew安装 Elasticsearch »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>